// 创建并配置了一个 axios 实例，用于管理 HTTP 请求，
// 并添加了请求和响应拦截器来处理身份验证、错误处理和响应数据的格式化
//实现了全局的请求处理逻辑，
//包括处理身份验证令牌、统一请求数据格式、错误处理以及用户友好的提示信息
import axios from "axios";// 导入axios库，用于发起HTTP请求
import JwtService from "@/core/services/JwtService";// 导入用于JWT令牌操作的服务
import Swal from "sweetalert2";// 导入SweetAlert2库，用于弹窗提示
import { useRouter } from "vue-router";// 导入Vue Router的useRouter钩子，用于路由操作
import { useStuIdStore } from "@/stores/stuIdStore";// 导入状态管理中的用户ID存储
import qs from "qs";// 导入qs库，用于处理query
import NProgress from "nprogress";// 导入NProgress库，用于显示进度条

NProgress.configure({ showSpinner: false });// 配置NProgress，关闭进度条的显示

const stuIdStore = useStuIdStore();// 创建用户ID存储的实例
const router = useRouter();// 创建Vue Router的实例

// 创建axios实例，并配置基础URL、超时时间和请求头
const instance = axios.create({
  baseURL: "/api",
  timeout: 10000,
  headers: {
    "Content-Type": "application/x-www-form-urlencoded",
  },
});

// 请求拦截器，用于在请求发送之前进行一些操作(加token，参数编码转换为叉3w)
instance.interceptors.request.use(
  (config) => {
    NProgress.start(); // 显示进度条
    // 如果存在token，则添加到请求头中
    if (JwtService.getToken()) {
      config.headers.Authorization = `Bearer ${JwtService.getToken()}`;
    }

    // 统一处理 POST 请求的数据格式，如果请求方法是POST，
    //并且内容类型是'application/x-www-form-urlencoded'，
    //则将请求数据转换为query string
    if (
      config.method === "post" &&
      config.headers["Content-Type"] === "application/x-www-form-urlencoded"
    ) {
      config.data = qs.stringify(config.data);
    }

    return config;
  },
  (error) => {
    // 处理请求错误
    return Promise.reject(error);
  }
);

// 响应拦截器，用于在响应返回时进行一些操作（处理token过期和其他错误情况。token过期跳转到登录，其他错误弹框报错）
instance.interceptors.response.use(
  (response) => {
    NProgress.done(); // 隐藏进度条
    // 根据响应状态码进行不同的处理
    if (response.data.code == 401 || response.data.code == 403) {
      // 处理token过期
      Swal.fire({
        title: "Error" + response.data.code + "!",
        text: "token过期，请重新登录",
        icon: "error",
        confirmButtonText: "OK, got it!",
      });
      localStorage.removeItem("userRole"); // 清除存储的用户角色
      JwtService.destroyToken();// 清除token
      stuIdStore.clearStuId();// 清除用户ID
      router.push({ name: "login" });// 导航到登录页面
    } else if (response.data.code != 0) {
      // 处理其他错误情况
      Swal.fire({
        title: "Error" + response.data.code + "!",
        text: response.data.msg,
        icon: "error",
        confirmButtonText: "OK, got it!",
      });
    }
    // 返回响应的数据部分
    return response.data;
  },
  (error) => {
    NProgress.done(); // 隐藏进度条
    // 处理响应错误
    if (error.response) {
      // 根据响应状态码进行不同的错误处理
      switch (error.response.status) {
        case 404:
          // 请求的资源未找到
          Swal.fire({
            title: "Error 404!",
            text: "请求的资源未找到",
            icon: "error",
            confirmButtonText: "OK, got it!",
          });
          break;
        default:
          Swal.fire({
            title: "Error!",
            text: error.response.data.message,
            icon: "error",
            confirmButtonText: "OK, got it!",
          });
          break;
      }
    }
    return 0;
  }
);

// 导出axios实例，以便在应用程序的其他部分使用
export default instance;
